package photoPrint;
import java.io.Serializable;

import dataStructures.Queue;

/**
 * 
 */

/**
 * Tipo abstracto de dados que representa o sistema de impressao de fotos
 * 
 * @author filiperosa
 *
 */
public interface TADSystem extends Serializable {

	/**
	 * Adiciona uma foto ao sistema
	 * @param code
	 * @param name
	 * @param width
	 * @param height
	 */
	boolean addPhoto(String code, String name, int width, int height);
	
	/**
	 * Adiciona uma album ao sistema
	 * @param code
	 * @return resultado da operacao
	 */
	boolean addAlbum(String code);
	
	/**
	 * Adiciona uma fotografia do sistema a um album ao sistema
	 * @param photoCode
	 * @param albumCode
	 * @param printWidth
	 * @param printHeight
	 * @return resultado da operacao
	 */
	int addPhotoToAlbum(String photoCode, String albumCode, int printWidth, int printHeight);
	
	/**
	 * Adiciona uma impressora ao sistema
	 * @param name
	 * @param location
	 * @param maxWidth
	 * @param maxHeight
	 * @param maintenanceValue
	 * @return resultado da operacao
	 */
	int addPrinter(String name, String location, int maxWidth, int maxHeight, int maxPrints, int maintenanceValue);
	
	/**
	 * Remove a impressora referida
	 * @param name
	 * @return resultado da operacao
	 */
	boolean removePrinter(String name);
	
	/**
	 * Adiciona um album a uma impressora
	 * @param albumCode
	 * @param name
	 * @return resultado da operacao
	 */
	int addAlbumToPrinter(String albumCode, String name);
	
	/**
	 * Retorna a fila de espera da impressora referida
	 * @param name
	 * @return stack
	 */
	Queue<TADAlbum> print(String name);
	
	/**
	 * Retorna os albuns em fila de espera da impressora do sistema
	 * @return stack
	 */
	TADPrinter printer();
	
	/**
	 * Faz a manutencao da impressora se esta precisar
	 * @return resultado da operacao
	 */
	boolean maintenance();
}
